package com.matinzac.controller;


import com.matinzac.entity.PayOrder;
import com.matinzac.res.AjaxResult;
import com.matinzac.service.WxPayService;
import com.matinzac.util.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;

/**
 * <p>Description: 微信支付相关接口</p>
 *
 * @author MtinZac
 * create on 2021/11/26 上午10:40
 */
@Slf4j
@CrossOrigin
@RequestMapping("/app")
@RestController
public class WxPayController {

    @Resource
    private WxPayService payService;


    /**
     * 通过商户配置文件获取证书编号
     *
     * @return 返回证书编号
     */
    @GetMapping("/getMchSerialNo")
    public AjaxResult getMchSerialNo() {
        String mchSerialNo = payService.getMchSerialNo();
        return AjaxResult.success().put("mchSerialNo", mchSerialNo);
    }



    /**
     * 通过 code 换取 openId
     *
     * @param code 微信客户端code值
     * @return 返回换取的openId
     */
    @GetMapping("/getOpenId/{code}")
    public AjaxResult getOpenId(@PathVariable String code) {
        if (StringUtils.isEmpty(code)) {
            AjaxResult.error("code不能为空");
        }
        String openId = payService.getOpenId(code);
        return AjaxResult.success().put("openId", openId);
    }


    /**
     * 通过 openId 和活动 id 获取支付信息参数
     * 微信支付 jsapi 文档  https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_1.shtml
     * @param openid 客户端唯一标识符
     * @param aid    活动ID
     * @return
     */
    @GetMapping("/getPayInfo/{openid}/{aid}")
    public AjaxResult getPayInfo(@PathVariable("openid") String openid, @PathVariable("aid") String aid) {
        if (StringUtils.isEmpty(openid)) {
            AjaxResult.error("openid不能为空");
        }
        if (StringUtils.isEmpty(aid)) {
            AjaxResult.error("aid 不能为空");
        }

        // TODO 查询订单支付状态同一笔订单或者同一个商品防止超付

        PayOrder payOrder = new PayOrder();

        // TODO 这里需要设置订单超时时间的可以在这里进行配置,在 dateUtils 提供了相关的方法进行时间格式转换具体参照
        // 微信 JSAPI 支付订单超时时间说明 https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_1.shtml


        //获取支付参数进行返回
        Map<String, Object> payInfo = payService.getPayInfo(openid, null, payOrder);

        //成功取到支付返回信息后创建订单
        // TODO 将订单信息进行存储
        //返回支付参数唤起微信支付
        return AjaxResult.success().put("payInfo", payInfo).put("order", payOrder);
    }


    /**
     * 支付成功回调接口
     *
     * @param body    微信返回参数体
     * @param request 请求体
     * @return
     */
    @PostMapping("/pay/callback")
    public Map orderPayCallback(@RequestBody Map body, HttpServletRequest request) {
        return payService.callBack(body, request);
    }


}
